package br.com.jogos;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class JogoVelha extends JFrame {

	JButton botao1, botao2, botao3, botao4, botao5, botao6, botao7, botao8, botao9, botaoNovo;
	boolean b1=false, b2=false, b3=false, b4=false, b5=false, b6=false, b7=false, b8=false, b9=false;  
	boolean pcJogando=false;
	boolean minhasPecas[] = new boolean[9];
	boolean pcPecas[] = new boolean[9];
	boolean allPecas[] = new boolean[9];
	boolean jogoAcabou=false;
	int totMov=0;
	
	public JogoVelha(){
		setTitle("Meu Jogo da Velha");
		setSize(400,400);
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(500, 200, 400, 400);

		Container c = getContentPane();
		c.setLayout(new BorderLayout(5, 5));

		Container c2 = new JPanel();
		c2.setLayout(new GridLayout(3, 3, 5, 5));
		
		botao1 = new JButton();botao1.addActionListener(new botaoAdapter());botao1.setName("b1");
		botao2 = new JButton();botao2.addActionListener(new botaoAdapter());botao2.setName("b2");
		botao3 = new JButton();botao3.addActionListener(new botaoAdapter());botao3.setName("b3");
		botao4 = new JButton();botao4.addActionListener(new botaoAdapter());botao4.setName("b4");
		botao5 = new JButton();botao5.addActionListener(new botaoAdapter());botao5.setName("b5");
		botao6 = new JButton();botao6.addActionListener(new botaoAdapter());botao6.setName("b6");
		botao7 = new JButton();botao7.addActionListener(new botaoAdapter());botao7.setName("b7");
		botao8 = new JButton();botao8.addActionListener(new botaoAdapter());botao8.setName("b8");
		botao9 = new JButton();botao9.addActionListener(new botaoAdapter());botao9.setName("b9");
		botaoNovo = new JButton("Novo Jogo");
		botaoNovo.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {

				if(JOptionPane.showConfirmDialog(null, "Novo Jogo?") == JOptionPane.YES_OPTION){
					
					for (int i = 0; i < 9; i++) {
						minhasPecas[i]=false;
						pcPecas[i]=false;
					}
					
					b1=false; 
					b2=false; 
					b3=false; 
					b4=false; 
					b5=false; 
					b6=false; 
					b7=false; 
					b8=false; 
					b9=false;  
					pcJogando=false;
					jogoAcabou=false;
					limpaBotoes(botao1);
					limpaBotoes(botao2);
					limpaBotoes(botao3);
					limpaBotoes(botao4);
					limpaBotoes(botao5);
					limpaBotoes(botao6);
					limpaBotoes(botao7);
					limpaBotoes(botao8);
					limpaBotoes(botao9);
				}
				
				
			}
		});
		
		c2.add(botao1);
		c2.add(botao2);
		c2.add(botao3);
		c2.add(botao4);
		c2.add(botao5);
		c2.add(botao6);
		c2.add(botao7);
		c2.add(botao8);
		c2.add(botao9);

		c.add(BorderLayout.NORTH, botaoNovo);
		c.add(BorderLayout.CENTER, c2);

	}

	public void setaBotaoPC(JButton botao){
		totMov++;
		botao.setFont(new Font("Serif", Font.BOLD, 72));
		botao.setText("0");
	}
	
	public void verificaJogadas(){
		
		//horizontal
		if((minhasPecas[0] && minhasPecas[1] && minhasPecas[2]) ||
		  (minhasPecas[3] && minhasPecas[4] && minhasPecas[5]) ||
		  (minhasPecas[6] && minhasPecas[7] && minhasPecas[8]) ||

		  //vertical
		  (minhasPecas[0] && minhasPecas[3] && minhasPecas[6]) ||
		  (minhasPecas[1] && minhasPecas[4] && minhasPecas[7]) ||
		  (minhasPecas[2] && minhasPecas[5] && minhasPecas[8]) ||

		  //diagonal
		  (minhasPecas[0] && minhasPecas[4] && minhasPecas[8]) ||
		  (minhasPecas[2] && minhasPecas[4] && minhasPecas[6])){
			
			jogoAcabou=true;
			JOptionPane.showMessageDialog(null, "Voce ganhou, parabéns");
		
		} else {
			if((pcPecas[0] && pcPecas[1] && pcPecas[2]) ||
		
				  (pcPecas[3] && pcPecas[4] && pcPecas[5]) ||
				  (pcPecas[6] && pcPecas[7] && pcPecas[8]) ||

				  //vertical
				  (pcPecas[0] && pcPecas[3] && pcPecas[6]) ||
				  (pcPecas[1] && pcPecas[4] && pcPecas[7]) ||
				  (pcPecas[2] && pcPecas[5] && pcPecas[8]) ||

				  //diagonal
				  (pcPecas[0] && pcPecas[4] && pcPecas[8]) ||
				  (pcPecas[2] && pcPecas[4] && pcPecas[6])){
					
					jogoAcabou=true;
					JOptionPane.showMessageDialog(null, "Voce perdeu, foi  mal !!!");
				
				}
			}
	}
	
	public void defesa(){
		
		pcJogando = true;

		verificaJogadas();
		
		if(!jogoAcabou){

			/* Defesas principais */
			//primeira linha horizontal
			if(b1 && b2 && !b3){
				b3=true;
				pcPecas[2]=true;
				setaBotaoPC(botao3);
			}else if(b1 && b3 && !b2){
				b2=true;
				pcPecas[1]=true;
				setaBotaoPC(botao2);
			}else if(b2 && b3 && !b1){
				b1=true;
				pcPecas[0]=true;
				setaBotaoPC(botao1);
			}
			//segunda linha horizontal
			else if(b4 && b5 && !b6){
				b5=true;
				pcPecas[5]=true;
				setaBotaoPC(botao6);
			}else if(b4 && b6 && !b5){
				b4=true;
				pcPecas[4]=true;
				setaBotaoPC(botao5);
			}else if(b5 && b6 && !b4){
				b3=true;
				pcPecas[3]=true;
				setaBotaoPC(botao4);
			}
			//terceira linha horizontal
			else if(b7 && b8 && !b9){
				b9=true;
				pcPecas[8]=true;
				setaBotaoPC(botao9);
			}else if(b7 && b9 && !b8){
				b8=true;
				pcPecas[7]=true;
				setaBotaoPC(botao8);
			}else if(b8 && b9 && !b7){
				b7=true;
				pcPecas[6]=true;
				setaBotaoPC(botao7);
			}
			//primeira coluna vertical
			else if(b1 && b4 && !b7){
				b7=true;
				pcPecas[6]=true;
				setaBotaoPC(botao7);
			}else if(b1 && !b4 && b7){
				b4=true;
				pcPecas[3]=true;
				setaBotaoPC(botao4);
			}else if(!b1 && b4 && b7){
				b1=true;
				pcPecas[0]=true;
				setaBotaoPC(botao1);
			}
			//segunda coluna vertical
			else if(b2 && b5 && !b8){
				b8=true;
				pcPecas[7]=true;
				setaBotaoPC(botao8);
			}else if(b2 && !b5 && b8){
				b5=true;
				pcPecas[4]=true;
				setaBotaoPC(botao5);
			}else if(!b2 && b5 && b8){
				b2=true;
				pcPecas[1]=true;
				setaBotaoPC(botao2);
			}
			//terceira coluna vertical
			else if(b3 && b6 && !b9){
				b9=true;
				pcPecas[8]=true;
				setaBotaoPC(botao9);
			}else if(b3 && !b6 && b9){
				b6=true;
				pcPecas[5]=true;
				setaBotaoPC(botao6);
			}else if(!b3 && b6 && b9){
				b3=true;
				pcPecas[2]=true;
				setaBotaoPC(botao3);
			}
			
			/* Defesas básicas, jogada do adversario */
			else
			{

				Random rand = new Random(); 
				int i = rand.nextInt( 9 - totMov);
				System.out.println("i: " + i);
				System.out.println("totMov: " + totMov);
				
			}
			
		}

	}
	
	public void limpaBotoes(JButton botaoAux){
		botaoAux.setName("");
		botaoAux.setText("");
	}
	
	public class botaoAdapter implements ActionListener{

		@Override
		public void actionPerformed(ActionEvent e) {
			
			String botao="";
			String valor="";
			botao=((JButton) e.getSource()).getName();
			valor=((JButton) e.getSource()).getText();

			if(valor.equals("") && !pcJogando && !jogoAcabou) {

				totMov++;
				
				if(botao.equals("b1")){
					minhasPecas[0] = true;
					b1=true;
				}
				else if(botao.equals("b2")){
					minhasPecas[1] = true;
					b2=true;
				}
				else if(botao.equals("b3")){
					minhasPecas[2] = true;
					b3=true;
				}
				else if(botao.equals("b4")){
					minhasPecas[3] = true;
					b4=true;
				}
				else if(botao.equals("b5")){
					minhasPecas[4] = true;
					b5=true;
				}
				else if(botao.equals("b6")){
					minhasPecas[5] = true;
					b6=true;
				}
				else if(botao.equals("b7")){
					minhasPecas[6] = true;
					b7=true;
				}
				else if(botao.equals("b8")){
					minhasPecas[7] = true;
					b8=true;
				}
				else if(botao.equals("b9")){
					minhasPecas[8] = true;
					b9=true;
				}

				((JButton) e.getSource()).setFont(new Font("serif", Font.BOLD, 72));
				((JButton) e.getSource()).setText("X");

				defesa();
				pcJogando=false;

			}
			
		}
		
	}
	
	public static void main(String[] args) {
		new JogoVelha();
	}


}
